#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
int g_val=100;
int g_val_1;
int g_val_2=100;
int main(int argc,char*argv[],char*env[])
{
 //   putenv("ZCG=555");
 //   printf("ZCG:%s",getenv("ZCG"));
 //   return 0;
 //   char *str="hello bit";
 //   *str='H';
 //   return 0;
 //  pid_t id=fork();
 //  if(id==0)
 //  {
 //     int cnt=5;
 //     while(cnt--)
 //     {
 //         g_val+=100;
 //         printf("i am child,pid:%d,ppid:%d,g_val:%d,&g_val:%p\n",getpid(),getppid(),g_val,&g_val);
 //         sleep(1);
 //         if(cnt) ;
 //         else
 //         {
 //             g_val=200;
 //             printf("子进程change g_val:100->200\n");
 //         }
 //     }
 //  }
 //  else
 //  {
 //      int cnt=10;
 //      while(cnt--)
 //      {
 //          printf("i am parent,pid:%d,ppid:%d,g_val:%d,&g_val:%p\n",getpid(),getppid(),g_val,&g_val);
 //          sleep(1);
 //      }

 //       wait(0);
 //  }
  

    printf("code addr: %p\n", main);
    const char *str = "hello bit";
    printf("read only string addr: %p\n", str);
    printf("init global value addr: %p\n", &g_val_2);
    printf("uninit global value addr: %p\n", &g_val_1);
    char *mem = (char*)malloc(100);
    char *mem1 = (char*)malloc(100);
    char *mem2 = (char*)malloc(100);
    printf("heap addr: %p\n", mem);
    printf("heap addr: %p\n", mem1);
    printf("heap addr: %p\n", mem2);
    printf("stack addr: %p\n", &str);
    printf("stack addr: %p\n", &mem);
    static int a = 0;
    int b;
    int c;
    printf("a = stack addr: %p\n", &a);//a的地址是在全局初始化变量里面
    printf("stack addr: %p\n", &b);
    printf("stack addr: %p\n", &c);
    int i = 0;
    for(; argv[i]; i++)
        printf("argv[%d]: %p\n", i, argv[i]);

    for(i=0; env[i]; i++)
        printf("env[%d]: %p\n", i, env[i]);
    return 0;
}

